package com.atguigu06.polymorphism;

/**
 * ClassName: PersonTest1
 * Package: com.atguigu06.polymorphism
 * Description:
 *
 * @Author ZY
 * @Create 19:48
 * @Version 1.0
 */
public class PersonTest1 {
    public static void main(String[] args) {
        Person p1 = new Man();

        //不能直接调用子类的特有的方法
//        p1.earnMoney();

        //向下转型
        Man m1 = (Man) p1;
        m1.earnMoney();
        System.out.println(m1.isSmoking);

        System.out.println(p1 == m1);//true  --> p1和m1指向堆空间中的同一个对象

        /*
            向下转型可能会出现：类型转换异常(ClassCastException)
         */
        Person p2 = new Woman();
//        Woman w2 = new Woman();
//        w2.goShopping();
//        Man m2 = (Man) p2;
//        m2.earnMoney();

        /*
            1.建议进行向下转型之前,使用instanceof关键字进行判断，避免出现类型转换异常
            2.格式：a(对象) instanceof A(类) : 判断对象a是否是类A的实例
            3.如果 a instanceof A 返回true，则：
                a instanceof superA 返回的也是true，
                其中A，是superA的子类。

         */
        Person p3 = new Woman();
        if(p3 instanceof Man){
            Man m2 = (Man) p3;
            m2.earnMoney();
        }
        if(p3 instanceof Woman){
            System.out.println("Woman");
        }
        if(p3 instanceof Person){
            System.out.println("Person");
        }
        if(p3 instanceof Object){
            System.out.println("Object");
        }
    }
}
